﻿// 3435. 位操作练习.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
/*
https://www.acwing.com/problem/content/3438/

给出两个不大于 65535的非负整数，判断其中一个的 16位二进制表示形式，是否能由另一个的 16 位二进制表示形式经过循环左移若干位而得到。

循环左移和普通左移的区别在于：最左边的那一位经过循环左移一位后就会被移到最右边去。

比如： 1011 0000 0000 0001 经过循环左移一位后，变成 0110 0000 0000 0011，若是循环左移2位，则变成 1100 0000 0000 0110。

输入格式
输入包含多组测试数据。

每组数据包含两个整数，占一行。

输出格式
每组数据输出一个结果，如果两个数之间能够进行移位转化则输出 YES，否则输出 NO。

数据范围
输入整数不超过 65535。
输入最多包含 100 组数据。

输入样例：
2 4
9 18
45057 49158
7 12
输出样例：
YES
YES
YES
NO
*/

int a, b;

string transBin(int x) {
	string res;
	while (x != 0) {
		if (x & 1) {
			res.push_back('1');
		}
		else {
			res.push_back('0');
		}
		x >>= 1;
	}
	while (res.size() < 16) {
		res.push_back('0');
	}

	reverse(res.begin(), res.end());

	return res;
}

void solve() {
	string va = transBin(a);
	va += va;
	string vb = transBin(b);

	for (int i = 0; i < va.size(); i++) {
		if (i + vb.size() > va.size()) break;
		if (vb == va.substr(i, vb.size())) {
			cout << "YES" << endl;
			return;
		}
	}
	cout << "NO" << endl;
	return;
}

int main()
{
	while (cin >> a >> b) {
		solve();
	}

	return 0;
}

 